#ifndef FRAME_STATISTICS_H
#define FRAME_STATISTICS_H

#include <vector>
#include <memory>
#include <chrono>
#include <map>
#include <mutex>
#include "video_frame.h"

// 统计数据结构
struct StageStatistics {
    double avg_latency = 0.0;      // 平均延迟
    double min_latency = 1e9;      // 最小延迟
    double max_latency = 0.0;      // 最大延迟
    double std_dev_latency = 0.0;  // 延迟标准差
    size_t frame_count = 0;        // 帧数量
};

struct FrameStatisticsData {
    // 时间窗口信息
    std::chrono::system_clock::time_point window_start;
    std::chrono::system_clock::time_point window_end;
    
    // 帧率统计
    double avg_frame_rate = 0.0;   // 平均帧率
    size_t total_frames = 0;       // 总帧数
    
    // 码率统计
    double avg_bitrate = 0.0;      // 平均码率 (Kbps)
    size_t total_data_size = 0;    // 总数据量
    
    // 帧间隔统计
    double avg_interval = 0.0;     // 平均帧间隔 (ms)
    double std_dev_interval = 0.0; // 帧间隔标准差
    
    // 帧大小统计
    double avg_frame_size = 0.0;   // 平均帧大小 (bytes)
    double std_dev_frame_size = 0.0; // 帧大小标准差
    size_t min_frame_size = 1e18;  // 最小帧大小
    size_t max_frame_size = 0;     // 最大帧大小
    
    // 各阶段延迟统计
    std::map<FrameStage, StageStatistics> stage_stats;
    
    // 端到端延迟统计
    double avg_end_to_end = 0.0;
    double min_end_to_end = 1e9;
    double max_end_to_end = 0.0;
    double std_dev_end_to_end = 0.0;
};

// 帧统计分析类
class FrameStatistics {
private:
    std::chrono::seconds window_duration_;  // 统计窗口时长
    std::chrono::system_clock::time_point current_window_start_;  // 当前窗口开始时间
    
    std::vector<std::shared_ptr<VideoFrame>> frames_;  // 窗口内的帧
    std::vector<double> frame_intervals_;  // 帧间隔(ms)
    std::mutex data_mutex_;  // 数据保护互斥锁
    
    // 计算标准差
    double calculateStandardDeviation(const std::vector<double>& values, double mean);
    
    // 检查是否需要创建新的统计窗口
    bool shouldCreateNewWindow();
    
    // 重置当前窗口
    void resetCurrentWindow();

public:
    // 构造函数，指定统计窗口时长（秒）
    explicit FrameStatistics(std::chrono::seconds window_duration = std::chrono::seconds(60));
    
    // 添加帧到统计窗口
    void addFrame(std::shared_ptr<VideoFrame> frame);
    
    // 强制计算当前窗口的统计数据并重置窗口
    FrameStatisticsData calculateAndReset();
    
    // 检查是否有足够的数据进行统计
    bool hasEnoughData() const { return !frames_.empty(); }
};

#endif // FRAME_STATISTICS_H
